package com.lr.transfer.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class MD5Util {

    /*
     * 生成md5 有传入参数字符串
     */
    public static String MD5Encoder(String input) {
        long startTime = System.currentTimeMillis();    //获取开始时间
        //声明StringBuffer对象来存放最后的值
        StringBuffer rtn = new StringBuffer();
        try {
            //1.初始化MessageDigest信息摘要对象,并指定为MD5不分大小写都可以
            MessageDigest md = null;
            md = MessageDigest.getInstance("md5");
            //2.传入需要计算的字符串更新摘要信息，传入的为字节数组byte[],
            //将字符串转换为字节数组使用getBytes()方法完成
            //指定时其字符编码 为utf-8
            md.update(input.getBytes("utf-8"));
            //3.计算信息摘要digest()方法
            //返回值为字节数组
            byte[] hashCode = md.digest();
            //4.将byte[] 转换为找度为32位的16进制字符串
            //遍历字节数组
            for (byte b : hashCode) {
                //对数组内容转化为16进制，
                rtn.append(Character.forDigit(b >> 4 & 0xf, 16));
                //换2次为32位的16进制
                rtn.append(Character.forDigit(b & 0xf, 16));
            }
            long endTime = System.currentTimeMillis();    //获取结束时间
            log.info("md5运行时间：" + (endTime - startTime) + "ms");    //输出md5运行时间
            return rtn.toString();
        } catch (NoSuchAlgorithmException e) {
            log.error("md5摘要失败：" + e.fillInStackTrace());
            return rtn.toString();
        } catch (UnsupportedEncodingException e) {
            log.error("md5摘要失败：" + e.fillInStackTrace());
            return rtn.toString();
        }
    }

    public static void main(String[] args) {
//        System.out.println("begin");
//        HashMap<String, String> map = new HashMap<>(5);
//        for (int i = 0; i < 4; i++) {
//            map.put("" + i, i + "");
//
//        }
//        map.forEach((k, v) -> {
//            System.out.println("key" + k);
//            System.out.println("value" + v);
//        });
        tableSizeFor(5);
    }
    static final int MAXIMUM_CAPACITY = 1 << 30;

    static final int tableSizeFor(int cap) {
        System.out.println(MAXIMUM_CAPACITY);
        System.out.println(2^32);
        int n = cap - 1;
        System.out.println(n >>> 1);
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

}
